﻿using System;
using System.Collections.Generic;
using System.Data;

namespace Marmat.Data
{
    public interface BaseConnection
    {

        /// <summary>
        /// 返回或设置数据源的名称
        /// </summary>
        /// <value></value>
        /// <returns></returns>
        /// <remarks></remarks>
        string Name { get; set; }

        /// <summary>
        /// 返回或设置数据源的链接字符串
        /// </summary>
        string ConnectionString { get; set; }

        /// <summary>
        /// 获取数据源当前的状态。
        /// </summary>
        ConnectionState State { get; }

        /// <summary>
        /// 获取数据源的类型。
        /// </summary>
        SourceType SourceType { get; }

        /// <summary>
        /// 获取数据源的版本号。
        /// </summary>
        ConnectionVersionEnum ConnectionVersion { get; }

        /// <summary>
        /// 使用所指定的属性设置打开数据库连接
        /// </summary>
        /// <remarks></remarks>
        void Open();

        /// <summary>
        /// 使用所指定的属性设置关闭数据库连接
        /// </summary>
        /// <remarks></remarks>
        void Close();

        /// <summary>
        /// 获取数据源的当前日期
        /// </summary>
        /// <remarks></remarks>
        DateTime GetDate();

        /// <summary>
        /// 返回数据源所有数据表的集合
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        List<string> GetTableNames();

        /// <summary>
        /// 返回数据源所有视图的集合
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        List<string> GetViewNames();

        /// <summary>
        /// 返回数据源所有存储过程的集合
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        List<string> GetProceduresNames();

        /// <summary>
        /// 返回数据源指定表的所有字段
        /// </summary>
        /// <param name="TableName"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        DataTable GetColumns(string TableName);

        /// <summary>
        /// 用于执行返回单个值的命令。
        /// </summary>
        /// <param name="options">执行参数</param>
        /// <returns></returns>
        object ExecuteScalar(ConnectionExecuteOptions options);

        /// <summary>
        /// 执行 SQL 语句并返回受影响的行数。
        /// </summary>
        /// <param name="options">执行参数</param>
        /// <returns></returns>
        int ExecuteNonQuery(ConnectionExecuteOptions options);

        /// <summary>
        /// 用于从后台提取数据生成一个临时的DataTable，而这个DataTable只存在于代码的运行过程中，不会以表的形式呈现给用户。
        /// </summary>
        /// <param name="options">执行参数</param>
        /// <returns></returns>
        DataTable ExecuteReader(ConnectionExecuteOptions options);
    }
}